import g
import os
import asyncio
from telebot.async_telebot import AsyncTeleBot
from telebot import types
import telebot 
from mysqlMod import *
import outlineMod
from jsonMod import *
from utilsMod import *
from keyMod import *
from enum import auto, Enum, IntEnum, unique
import json

if os.environ['HTTP_PROXY']:
    from telebot import asyncio_helper
    asyncio_helper.proxy = os.environ['HTTP_PROXY']

bot = AsyncTeleBot(os.environ['TOKEN'])

class cMenu(ExtraEnum):

    def setup(self):
        self.add('Hello', '👋 Поздороваться')
        self.add('Ask', '❓ Задать вопрос')
        self.add('ShowButton', '🎃 Показать кнопку')
        self.add('Why', 'Почему именно мы?')
        self.add('Conditions', 'Условия и цены')
        self.add('MyInfo', 'Информация')
        self.add('AllKeys', 'Все ключи(админ)')
        self.add('AddKey', 'Добавить ключ')
        self.add('ShowKey', '')
        self.add('GenerateKey', 'Сгенерировать ключ')
        self.add('DeactivateKey', 'Деактивировать ключ')
        self.add('ActivateKey', 'Активировать ключ')
        self.add('ReturnToMainMenu', 'Вернуться в главное меню')

enMenu = cMenu()
enMenu.setup()

def markupMainMenu():
    markup = InlineMyMarkup()
    markup.add(enMenu.k('Hello'))
    markup.add(enMenu.k('Ask'))
    markup.add(enMenu.k('MyInfo'))
    markup.add(enMenu.k('AllKeys'))
    markup.add(enMenu.k('AddKey'))
    markup.add(enMenu.k('ShowButton'))
    return markup.get()

def markupAskMe():
    markup = InlineMyMarkup()
    markup.add(enMenu.k('Why'))
    markup.add(enMenu.k('Conditions'))
    markup.add(enMenu.k('ReturnToMainMenu'))
    return markup.get()

def markupShowButton():
    markup = InlineMyMarkup()
    markup.addNoCb("Сайт Хабр", 'https://habr.com/ru/all/')
    markup.addNoCb("Хуяндекс", 'https://habr.com/ru/all/')
    markup.add(enMenu.k('ReturnToMainMenu'))
    return markup.get()

def keysDynamicMarkup(keys):
    markup = InlineMyMarkup()
    for each in keys:
        markup.add(cbKey('ShowKey', f"{each['ClientTGid']} | {each['ClientTGname']} | Кл {each['id']} | Active {each['isActive']}", each['id']))
    markup.add(enMenu.k('ReturnToMainMenu'))
    return markup.get()

@bot.message_handler(commands=['start'])
async def start(message):
    await bot.send_message(message.chat.id,text="Привет, {0.first_name}! Я бот-помощник сервиса BarinVPN".format(message.from_user), reply_markup=markupMainMenu())

@bot.message_handler(commands=['help']) #создаем команду
async def help(message):
    markup = types.InlineKeyboardMarkup()
    markup.add(types.InlineKeyboardButton("Сайт Хабр", url='https://habr.com/ru/all/'), row_width=1)
    await bot.send_message(message.chat.id, "Привет, {0.first_name}! Нажми на кнопку и перейди на сайт)".format(message.from_user), reply_markup=markup)

async def showKey(dbHandler, cb, k):
    markup = InlineMyMarkup()

    w='GenerateKey'
    markup.add(cbKey(w, enMenu.k(w).text, k.data))

    w='ActivateKey'
    markup.add(cbKey(w, enMenu.k(w).text, k.data))

    w='DeactivateKey'
    markup.add(cbKey(w, enMenu.k(w).text, k.data))

    markup.add(enMenu.k('ReturnToMainMenu'))
    await editMessage(bot, cb, str(dbHandler.SelectOneKey(k.data)[0]), markup.get())

async def activeteKey(dbHandler, cb, k):
    mess = "OK" if dbHandler.ActivateKey(k.data) else "Fail"
    await editMessage(bot, cb, mess)

async def deactiveteKey(dbHandler, cb, k):
    mess = "OK" if dbHandler.DeactivateKey(k.data) else "Fail"
    await editMessage(bot, cb, mess)

async def addKey(cb, dbHandler):
    key = Key()
    mess = "OK" if dbHandler.InsertKey(key.FromCb(cb).Get()) else "Fail"
    await editMessage(bot, cb, mess)

async def getAllKeys(dbHandler, cb):
    keys = dbHandler.SelectAllKeys()
    await editMessage(bot, cb, f"KEYS {len(keys)}", keysDynamicMarkup(keys))

@bot.callback_query_handler(func=lambda cb:True)
async def func(cb):

    res=cbKey().fromCBkey(cb.data)
    match (res.id):

      case 'Hello':
         await editMessage(bot, cb, "Мы предлагаем действительно приватный сервис VPN с человеческим лицом")
        
      case 'Ask':
         await editMessage(bot, cb, "Задай мне вопрос", markupAskMe())
 
      case 'Why':
         await editMessage(bot, cb, "Потому что кто, если не мы?")
 
      case 'ShowButton':
         await editMessage(bot, cb,"{0.first_name}, выбери, для какой операционной системы тебе нужна инструкция)".format(cb.message.chat), markupShowButton())
 
      case 'Conditions':
         await editMessage(bot, cb, "Три рубля кучка, в кучке три штучки")
 
      case 'MyInfo':
         await editMessage(bot, cb, vars(cb.message.chat))
 
      case 'AllKeys':
         await getAllKeys(dbHandler, cb)
 
      case 'AddKey':
         await addKey(cb, dbHandler)
 
      case 'ShowKey':
         await showKey(dbHandler, cb, res)

      case 'ActivateKey':
         await activeteKey(dbHandler, cb, res)

      case 'DeactivateKey':
         await deactiveteKey(dbHandler, cb, res)
 
      case 'ReturnToMainMenu':
         await editMessage(bot, cb, "Вы вернулись в главное меню", markupMainMenu())

      case _:
         await editMessage(bot, cb, "На такую комманду я не запрограммировал..")


############# MAIN ############################################################

args  = g.Args()
g.setLogger(args)

config = JsonConfig(
    args.config_filename
).raw()

g.log.info('using config: ' + args.config_filename)

dbHandler = DbMod()

asyncio.run(bot.polling(restart_on_change=True))
